package com.zlsy.springbootdemo.encryption.utils;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import lombok.extern.slf4j.Slf4j;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author zhouliang
 * @date 2020/12/17 13:42
 */
@Slf4j
public class GsonUtil {
  private static Comparator<String> getComparator() {
    return Comparator.naturalOrder();
  }

  /** json按照字典序排序：全排，不止排外层 */
  public static void sort(JsonElement e) {
    if (e.isJsonNull()) {
      return;
    }

    if (e.isJsonPrimitive()) {
      return;
    }

    if (e.isJsonArray()) {
      JsonArray a = e.getAsJsonArray();
      for (JsonElement jsonElement : a) {
        sort(jsonElement);
      }
      return;
    }

    if (e.isJsonObject()) {
      Map<String, JsonElement> tm = new TreeMap<>(getComparator());
      for (Map.Entry<String, JsonElement> en : e.getAsJsonObject().entrySet()) {
        tm.put(en.getKey(), en.getValue());
      }

      for (Map.Entry<String, JsonElement> en : tm.entrySet()) {
        e.getAsJsonObject().remove(en.getKey());
        e.getAsJsonObject().add(en.getKey(), en.getValue());
        sort(en.getValue());
      }
    }
  }
}
